<?php

/**
 * Here is your custom functions.
 */
use plugin\saiadmin\service\EmailService;
use plugin\saiadmin\app\model\system\SystemMail;
use plugin\saiadmin\utils\Arr;
use support\Log;

/**
 * 类似js的findIndex方法，用于在数组中查找符合条件的元素索引
 */
function Array_findIndex(array $array, callable $callback): int
{
    foreach ($array as $index => $value) {
        if ($callback($value, $index, $array)) {
            return $index;
        }
    }
    return -1; // 未找到时返回 -1（同 JS）
}


// 生成随机字符串
function GenerateRandomStr(int $length = 6): string
{
    $min = pow(10, $length - 1);
    $max = pow(10, $length) - 1;
    return (string)mt_rand($min, $max);
}


// 格式化时间戳
function formatTimestamp( $timestamp = null, string $format = 'Y-m-d H:i:s', string $timezone = 'Asia/Shanghai',string $default = ''): string {
    // 处理空时间戳（使用当前时间）
    if ($timestamp === null) {
        $timestamp = time();
    }

    // 处理毫秒级时间戳（转换为秒级）
    if (is_numeric($timestamp) && strlen((string)$timestamp) > 10) {
        $timestamp = (int)($timestamp / 1000);
    }

    // 验证时间戳有效性
    if (!is_numeric($timestamp) || $timestamp < 0) {
        return $default;
    }
    $timestamp = (int)$timestamp;

    try {
        // 设置时区并格式化
        $date = new \DateTime();
        $date->setTimezone(new \DateTimeZone($timezone));
        $date->setTimestamp($timestamp);
        return $date->format($format);
    } catch (\Exception $e) {
        Log::warning('时间戳格式化失败：' . $e->getMessage());
        // 异常时返回默认值
        return $default;
    }
}

/**
 * 发送邮件
 */
function sendEmail($to, $subject, $content, $code){
    if(empty($to)||empty($subject)||empty($content)){
        return false;
    }
    $config = EmailService::getConfig();
    $model = SystemMail::create([
        'gateway' => Arr::getConfigValue($config,'Host'),
        'from' => Arr::getConfigValue($config,'From'),
        'email' => $to,
        'code' => $code,
        'content' => $content
    ]);
    $template = [
        'code' => $code
    ];
    try {
        $result = EmailService::sendByTemplate($to, $subject, $content, $template);
        if (!empty($result)) {
            $model->status = 'failure';
            $model->response = $result;
            $model->save();
            throw new \Exception(trans('common.mail_fail'));
        } else {
            $model->status = 'success';
            $model->save();
            return true;
        }
    } catch (\Exception $e) {
        $model->status = 'failure';
        $model->response = $e->getMessage();
        $model->save();
        throw new \Exception($e->getMessage());
    }
}

// 发送短息验证码
function sendMessage($mobile, $code, $params = [], $action = 'common'){
    $mobile = $mobile;//手机号
    $params = [
        'code' => $code
    ];//参数
    $areacode = "86";//国际区号,腾讯云选传,其他不传
    $sms = new \Hzdad\Wbsms\Wbsms('aliyun');//传入短信服务商名称, 腾讯云 qcloud , 阿里云 aliyun, 七牛 qiniu, 华为 huawei
    $result = $sms->sendsms($action,$mobile,$params,$areacode);

    if ($result['code'] == 200) {
        Log::info('短信发送成功：' , $result);
        return true;
    } else {
        Log::error('短信发送失败：' , $result);
        return false;
    }
}

// 获取当前语言
function getLocale(){
    return request()->header('lang', 'zh_CN');
}

/**
 * 判断变量是否存在且有有效内容（替代 !empty()）
 * @param mixed $var 要判断的变量
 * @return bool
 */
function hasValue(&$var): bool {
    return !empty($var);
}

// 打印生成的SQL
function printSQL($sql){
    Log::info('执行SQL：'. $sql->buildSql() );
}

// 校验帮助类
class ValidationHelper {

    /**
     * 判断字符串是否为纯数字（整数或小数）
     * @param string $str 待验证的字符串
     * @return bool 是纯数字返回true，否则返回false
     */
    public static function isNumericString(string $str): bool {
        // 空字符串直接返回false
        if (!hasValue($str)) {
            return false;
        }
        
        // 正则匹配：
        return preg_match('/^-?(\d+(\.\d*)?|\.\d+)$/', $str) === 1;
    }

    /**
     * 判断字符串是否为中国大陆手机号
     * @param string $str 待验证的字符串
     * @return bool 是有效手机号返回true，否则返回false
     */
    public static function isPhone(string $str): bool {
        // 空字符串直接返回false
        if (!hasValue($str)) {
            return false;
        }
        
        // 正则匹配中国大陆手机号：
        return preg_match('/^1[3-9]\d{9}$/', $str) === 1;
    }

    /**
     * 判断字符串是否为有效邮箱地址
     * @param string $str 待验证的字符串
     * @return bool 是有效邮箱返回true，否则返回false
     */
    public static function isEmail(string $str): bool {
        if (!hasValue($str)) {
            return false;
        }
        // 邮箱验证正则：
        return preg_match('/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,}$/', $str) === 1;
    }
}

// 判断变量是否未false
function isFalse($value){
    return $value === false;
}


/**
 * 将数组中的每一项转为数字，过滤掉非数字项
 * @param array $array 待处理的数组
 * @param bool $isInt 是否转为整数（默认true），否则转为浮点数
 * @return array 处理后的数字数组
 */
function convertToNumbersArr(array $array, bool $isInt = true): array
{
    $result = [];
    
    foreach ($array as $item) {
        // 判断是否为有效数字（包括数字字符串）
        if (is_numeric($item)) {
            // 根据需求转为整数或浮点数
            $number = $isInt ? (int)$item : (float)$item;
            $result[] = $number;
        }
        // 非数字项自动过滤（不加入结果数组）
    }
    
    return $result;
}

// 打印MQTT日志
function printMqttLog($message){
    echo date('Y-m-d H:i:s') .'[MQTT]日志：' . $message . "\n";
    Log::info("[MQTT]日志：" . $message);
}

// 判断当前系统是否为Linux
function isLinux(){
    return PHP_OS_FAMILY === 'Linux';
}

